﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 天离安全_Mssql渗透系统.Services
{
    /// <summary>
    /// 链服务模块
    /// </summary>
     public class T_Link_ClientServices
    {
        /// <summary>
        /// 执行链服务的命令
        /// </summary>
        /// <param name="connection"></param>
        /// <param name="K"></param>
        /// <returns></returns>
        public static async Task ExecuteSqlCommand(SqlConnection connection, Action<string> statusCallback = null)
        {
            Api.T_Mssql_Excel.Info = new StringBuilder();

            // 定义要执行的 SQL 命令
            string sqlCommand = Api.T_Mssql_Excel.Esql; // 示例 SQL

            try
            {
                using (SqlCommand command = new SqlCommand(sqlCommand, connection))
                {
                    // 执行命令并获取结果
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        bool hasRows = false;

                        while (await reader.ReadAsync()) // 逐行读取
                        {
                            hasRows = true; // 确保至少有一行数据
                            StringBuilder rowOutput = new StringBuilder(); // 用于存储当前行的输出

                            // 遍历每一列
                            for (int i = 0; i < reader.FieldCount; i++)
                            {
                                // 读取每个列的值并拼接
                                object value = reader[i]; // 使用索引访问
                                rowOutput.Append($"{value?.ToString()}\t"); // 使用制表符分隔
                            }

                            // 将当前行的数据添加到 Info
                            //Api.T_Mssql_Excel.Info.AppendLine(rowOutput.ToString().TrimEnd('\t')); // 移除末尾的制表符
                            statusCallback?.Invoke(rowOutput.ToString().TrimEnd('\t'));
                        }

                        if (hasRows)
                        {
                            // Api.T_Mssql_Excel.Info.Append(DateTime.Now.ToString() + "：" + "命令执行成功" + "\r\n");
                        }
                        else
                        {
                            //Api.T_Mssql_Excel.Info.Append(DateTime.Now.ToString() + "：" + "命令执行成功，但没有返回数据" + "\r\n");
                            statusCallback?.Invoke("命令执行成功，但没有返回数据!");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                statusCallback?.Invoke("命令执行错误：" + ex.ToString());
                Api.T_Mssql_Excel.Info.Append(DateTime.Now.ToString() + "：" + "命令执行错误：" + ex.Message + "\r\n");
            }
        }
        /// <summary>
        /// 执行链服务上的系统命令
        /// </summary>
        /// <param name="connection"></param>
        /// <returns></returns>
        public static async Task ExecuteSqlCommandSystem(SqlConnection connection, Action<string> statusCallback = null)
        {
            Api.T_Mssql_Excel.Info = new StringBuilder();

            // 执行系统命令
            string sqlCommand = Api.T_Mssql_Excel.Esql;

            try
            {
                using (SqlCommand command = new SqlCommand(sqlCommand, connection))
                {
                    // 执行命令并获取结果
                    using (SqlDataReader reader = await command.ExecuteReaderAsync())
                    {
                        bool hasRows = false;
                        while (reader.Read())
                        {
                            hasRows = true; // 确保至少有一行数据
                            string output = reader[0]?.ToString(); // 读取输出
                            if (!string.IsNullOrEmpty(output))
                            {
                                //Api.T_Mssql_Excel.Info.Append(output + "\r\n");
                                statusCallback?.Invoke(output);
                            }
                        }

                        if (hasRows)
                        {
                            //Api.T_Mssql_Excel.Info.Append(DateTime.Now.ToString() + "：" + "命令执行成功" + "\r\n");
                        }
                        else
                        {
                            //Api.T_Mssql_Excel.Info.Append(DateTime.Now.ToString() + "：" + "命令执行成功，但没有返回数据" + "\r\n");
                            statusCallback?.Invoke("命令执行成功，但没有返回数据");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                //Api.T_Mssql_Excel.Info.Append(DateTime.Now.ToString() + "：" + "命令执行错误：" + ex.Message + "\r\n");
                statusCallback?.Invoke("命令执行错误：" + ex.Message);
            }
        }
    }
}
